home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 2 / Apprentice-Release2.iso / Source Code / Peter Lewis / PNL Libraries / MyBigDisplay.p < prev    next >
Encoding:
Text File  |  1994-03-02  |  3.8 KB  |  170 lines  |  [TEXT/PJMM]

  1. unit MyBigDisplay;
  2.  
  3. interface
  4.  
  5.     type
  6.         StyleSetting = record
  7.                 font: integer;
  8.                 size: integer;
  9.                 face: Style;
  10.             end;
  11.         ChunkKind = (CK_None, CK_Text, CK_Picture);
  12.         ChunkRecord = record
  13.                 data_length: longInt;
  14.                 case kind : ChunkKind of
  15.                     CK_Text: (
  16.                             ss: StyleSetting;
  17.                     );
  18.                     CK_Picture: (
  19.                     );
  20.             end;
  21.         LineRecord = record
  22.                 offset: longInt; { offset into chunks handle }
  23.                 ascent, descent: integer;
  24.                 dataoffset: longInt;
  25.             end;
  26.         LineRecordPtr = ^LineRecord;
  27.         LineRecordHandle = ^LineRecordPtr;
  28.         BigDisplay = record
  29. { You can set these, and then call Recalc }
  30.                 leading: integer;
  31.                 width: integer;
  32. { You can look, but don't touch }
  33.                 port: GrafPtr;
  34.                 total_height: longInt;
  35.                 line_count: longInt;
  36. { Don't even look }
  37.                 chunks: Handle;
  38.                 lines: LineRecordHandle;
  39.             end;
  40.  
  41.  
  42.     function CreateBigDisplay (var bd: BigDisplay; port: GrafPtr): OSErr;
  43.     procedure DestroyBigDisplay (var bd: BigDisplay);
  44.     function AddBDText (var bd: BigDisplay; var ss: StyleSetting; p: ptr; len: longInt): OSErr;
  45.     function RecalculateBigDisplay (var bd: BigDisplay): OSErr;
  46.  
  47. implementation
  48.  
  49.     uses
  50.         MyMemory;
  51.  
  52.     procedure GetStyleSetting (var ss: StyleSetting);
  53.     begin
  54.         ss.font := thePort^.txFont;
  55.         ss.size := thePort^.txSize;
  56.         ss.face := thePort^.txFace;
  57.     end;
  58.  
  59.     procedure SetStyleSetting (var ss: StyleSetting);
  60.     begin
  61.         TextFont(ss.font);
  62.         TextSize(ss.size);
  63.         TextFace(ss.face);
  64.     end;
  65.  
  66.     function CreateBigDisplay (var bd: BigDisplay; port: GrafPtr): OSErr;
  67.         var
  68.             err: OSErr;
  69.     begin
  70.         bd.leading := 2;
  71.         bd.width := 200;
  72.         bd.port := port;
  73.         bd.total_height := 0;
  74.         bd.line_count := 0;
  75.         err := MNewHandle(bd.chunks, 0);
  76.         if err = noErr then
  77.             err := MNewHandle(bd.lines, 0);
  78.         CreateBigDisplay := err;
  79.     end;
  80.  
  81.     procedure DestroyBigDisplay;
  82.     begin
  83.         MDisposeHandle(bd.chunks);
  84.         MDisposeHandle(bd.lines);
  85.     end;
  86.  
  87.     function AddBDText (var bd: BigDisplay; font, size: integer; face: Style; p: ptr; len: longInt): OSErr;
  88.         var
  89.             err, junk: OSErr;
  90.             cr: ChunkRecord;
  91.             orgsize: longInt;
  92.     begin
  93.         err := noErr;
  94.         if length(s) > 0 then begin
  95.             orgsize := GetHandleSize(bd.chunks);
  96.             cr.data_length := length(s);
  97.             cr.kind := CK_Text;
  98.             cr.font := font;
  99.             cr.size := size;
  100.             cr.face := face;
  101.             err := PtrAndHand(@cr, bd.chunks, SizeOf(ChunkRecord));
  102.             if err = noErr then
  103.                 err := PtrAndHand(p, bd.chunks, len);
  104.             if err <> noErr then begin
  105.                 SetHandleSize(bd.chunks, orgsize);
  106.             end;
  107.         end;
  108.         AddBDText := err;
  109.     end;
  110.  
  111.     function RecalculateBigDisplay (var bd: BigDisplay; var height: longInt): OSErr;
  112.         var
  113.             savedss: StyleSetting;
  114.             pos: longInt;
  115.             line: longInt;
  116.             offset, newoffset: longInt;
  117.             cr: ChunkRecord;
  118.             lr: LineRecord;
  119.             h, w, used: integer;
  120.             fi: FontInfo;
  121.             slbc: StyledLineBreakCode;
  122.     begin
  123.         SetPort(bd.port);
  124.         GetStyleSetting(savedss);
  125.         pos := 0;
  126.         bd.total_height := 0;
  127.         bd.line_count := 0;
  128.         line := 1;
  129.         junk := MSetHandleSize(bd.lines, 0);
  130.         lr.offset := 0;
  131.         lr.ascent := 0;
  132.         lr.descent := 0;
  133.         lr.dataoffset := 0;
  134.         h := 0;
  135.         LockHigh(bd.chunks);
  136.         while pos < GetHandleSize(bd.chunks) do begin
  137.             BlockMove(ptr(ord(bd.chunks^) + pos), @cr, SizeOf(ChunkRecord));
  138.             pos := pos + SizeOf(ChunkRecord);
  139.             offset := 0;
  140.             used := 0;
  141.             if cr.kind = CK_Text then begin
  142.                 SetStylSetting(cr.ss);
  143.                 GetFontInfo(fi);
  144.                 if fi.ascent > lr.ascent then
  145.                     lr.ascent := fi.ascent;
  146.                 if fi.descent > lr.descent then
  147.                     lr.descent := fi.descent;
  148. 1:
  149.                 w := width - used;
  150.                 slbc := StyledLineBreak(ptr(ord(bd.chunks^) + pos), cr.data_length, offset, cr.data_length, 0, w, newoffset);
  151.                 if newoffset = offset then begin
  152.                     if used = 0 then begin
  153.                         newoffset := newoffset + 1; { force at least one character per line! }
  154.                         w := width;
  155.                     end
  156.                     else begin
  157.                         BreakLine;
  158.                         goto 1;
  159.                     end;
  160.                 end;
  161.                 used := used + w;
  162.  
  163.             end;
  164.             pos := pos + cr.data_length;
  165.         end;
  166.         HUnLock(bd.chunks);
  167.         SetStyleSetting(savedss);
  168.     end;
  169.  
  170. end.